<?php
declare(strict_types=1);
// 用户列表
namespace app\admin_v1\controller;

use think\facade\Db; //门面模式

use app\admin_v1\model\User as MYSQL; //导入模型

class User
{

    public function new()
    {
        $query = request()->param(); //请求参数
        $time_int = time();
        $time = date('Y-m-d H:i:s', $time_int);
        $sqldb = MYSQL::create(
            [
                'dbid' => 'USER-' . common__guid()["salt_any"], //数据编号.唯一
                'uid' => null, //登录帐号.唯一
                'mobile' => null, //登录手机.唯一
                'email' => null, //登录邮箱.唯一
                'vid' => "1001", //雇员编号_可由上级随意更改
                'branch_dbid' => "1001", //机构编号
                'pw' => !empty($query['pw']) ? md5($query['pw']) : md5('123456'), //登录密码
                'name' => (isset($query['name']) && !empty($query['name'])) ? $query['name'] : "名称", //名称
                'login_ip' => '登录IP地址', //登录IP地址
                'login_hits' => 0, //登录次数
                'token' => md5('USER-' . common__guid()["salt_any"]), //登录令牌
                'dB_state' => 'ds', //数据状态
                'state' => $query['state'] ?? "A", //帐号状态_A正常B停用
                'type' => 'USER', //用户类型
                'memo' => empty($query['memo']) ? '创建时间:' . $time : $query['memo'], //备注
                'login_time' => $time_int, //登录时间
                'time_new' => $time_int, //创建时间
                'time_up' => $time_int, //修改时间
                'i' => 0, //排序
            ],
            // 许可写入的字段
            [
                'dbid', //数据编号.唯一
                'uid', //登录帐号.唯一
                'mobile', //登录手机.唯一
                'email', //登录邮箱.唯一
                'vid', //雇员编号_可由上级随意更改
                'pw', //登录密码
                'name', //名称
                'login_ip', //登录IP地址
                'login_hits', //登录次数
                'token', //登录令牌
                'dB_state', //数据状态
                'state', //帐号状态_A正常B停用
                'type', //用户类型
                'memo', //备注
                'time_login', //登录时间
                'time_new', //创建时间
                'time_up', //修改时间
            ]
        );
        unset($sqldb['pw']); //删除数组中的元素
        $apidb = [
            'code' => 200, //状态码
            'msg' => '新增成功', //状态信息
            'query' => $query, //请求参数
            'data_now' => $sqldb->toArray(),
            'data' => ['id' => $sqldb->id],
        ];
        // unset($sqldb2); //销毁
        return (json($apidb));
    }
    // 修改
    public function up()
    {
        $time_int = time();
        $time = date('Y-m-d H:i:s', $time_int);
        $query = request()->param(); //请求参数
        //开始操作SQL
        $sqldb = MYSQL::where('id', $query['id'])
            ->where([
                ['dbid', '=', $query['dbid']],
            ])
            ->find();
        unset($sqldb['pw']); //删除数组中的元素
        $data_formerly = $sqldb->toArray();
        if ($sqldb) {
            if (!empty($query['pw'])) {
                $sqldb->pw = md5($query['pw']);
            } else {
            }
            $sqldb->name = $query['name']; //名称
            $sqldb->state = $query['state']; //帐号状态_A正常B停用
            $sqldb->type = $query['type']; //用户类型
            $sqldb->memo = $query['memo']; //备注
            $sqldb->time_up = $time_int; //修改时间
            $umsg = $sqldb->save();
            if ($umsg !== false) {
                $msg = '更新成功!';
                $code = 200;
            } else {
                $msg = '更新失败!';
                $code = 201;
            }
        } else {
            $msg = '查询与更新失败!';
            $code = 202;
        }
        unset($sqldb['pw']); //删除数组中的元素
        unset($sqldb['token']); //删除数组中的元素
        unset($data_formerly['token']); //删除数组中的元素
        $apidb = [
            'help' => ["api_name" => "修改用户", "db_old" => "修改前的数据", "db_now" => "修改后的数据"], //API信息
            'code' => $code, //状态码
            'msg' => $msg, //状态信息
            'query' => $query, //请求参数
            'token' => request()->header('token'),
            'userdb' => cache('userdb_' . request()->header('token')),
            'db_old' => $data_formerly,
            'db_now' => $sqldb->toArray(),
        ];
        // unset($sqldb2); //销毁
        return (json($apidb));
    }
    // 列表
    public function List()
    {
        // 请求方式验证
        if (!request()->isPost()) {
            $apidb = ['code' => 201, 'msg' => "请求有误-不是Post方式!",];
            return json($apidb);
        }
        ;
        $limit = request()->param('limit', 10, 'trim'); //每页行数
        $current = request()->param('current', 1, 'trim'); //页码
        $SearchField = request()->param('SearchField', 'id', 'trim'); //搜索字段
        $SearchOperator = request()->param('SearchOperator', 'LIKE', 'trim'); //搜索查询表达式
        $SearchaAtistop = strval(request()->param('SearchaAtistop', "", 'trim')); //搜索关键词
        $SearchaSort = request()->param('SearchaSort', 'DESC', 'trim'); //搜索排序方式ASE,DESC升降序
        $SearchaSortField = request()->param('SearchaSortField', 'id', 'trim'); //排序字段
        $query = request()->param(); //请求参数
        // strval();//转成字符串
        // echo gettype(); //打印变量的类型
        // 查询表达式
        if ($SearchOperator == 'LIKE') {
            $SearchaAtistop = '%' . $SearchaAtistop . '%';
        }
        ;
        if ($SearchField == 'time_new' || $SearchField == 'time_up') {
            if ($SearchOperator == '>' || $SearchOperator == '<') {
                $SearchaAtistop = strtotime(strval($SearchaAtistop));
                if ($SearchField == 'time_new') {
                    $SearchField = 'time_new';
                } else if ($SearchField == 'time_up') {
                    $SearchField = 'time_up';
                }
            }
        }
        $help = [
            "db" => [
                "total" => "数据总行数",
                "per_page" => "每页数量",
                "current_page" => "当前页码",
                "last_page" => "最后一页/总页数",
                "data" => "数据集"
            ]
        ];
        $sqldb = MYSQL::where([
            [$SearchField, $SearchOperator, $SearchaAtistop],
        ])
            ->order($SearchaSortField, $SearchaSort)
            ->paginate([ //[文档]https://www.kancloud.cn/manual/thinkphp6_0/1037638
                'list_rows' => $limit, // 每页数量
                'page' => $current, // 当前页
            ]);
        // echo  MYSQL::getLastSql();
        //设置允许输出字段
        $sqldb = $sqldb->visible([
            'id', //主键
            'dbid', //数据编号.唯一
            'branch_dbid', //机构编号
            'uid', //登录帐号.唯一
            'mobile', //登录手机.唯一
            'email', //登录邮箱.唯一
            'vid', //雇员编号_可由上级随意更改
            'name', //名称
            'login_ip', //登录IP地址
            'login_hits', //登录次数
            'token', //登录令牌
            'db_state', //数据状态
            'state', //帐号状态_A正常B停用
            'type', //用户类型
            'memo', //备注
            'time_login', //登录时间
            'time_new', //创建时间
            'time_up', //修改时间
        ]);



        //设置允许字段
        $sqldb = $sqldb->visible([
        ]);
        //设置隐藏字段
        $sqldb = $sqldb->hidden([
            // "id", //主键
        ]);
        //设置追加字段
        $sqldb = $sqldb->append([
            "state2", //帐号状态_A正常B停用
            "time_new2", //创建时间
            "time_up2", //修改时间


            // "type2", //类型_ADMIN-AGENT-VIP-WX-USER-POS
            "group_dbid2", //集团数据编号
            "branch_dbid2", //机构数据编号
            "departments_dbid2", //部门数据编号


        ]);

        // 设置数据字段获取器
        // 帐号状态_A正常B停用
        $sqldb = $sqldb->withAttr("state2", function ($value, $data) {
            $res = ["A" => "正常", "B" => "停用", "" => "", null => ""];
            return $res[$data["state"]] ?? "---";
        });
        // 集团数据编号
        $sqldb = $sqldb->withAttr("group_dbid2", function ($value, $data) {
            // 返回某个字段的值
            $name = Db::table('admin__i_group')->where('dbid', $data["group_dbid"])->value('name');
            return $name ?? "---";
        });
        // 机构数据编号
        $sqldb = $sqldb->withAttr("branch_dbid2", function ($value, $data) {
            // 返回某个字段的值
            $name = Db::table('admin__i_group_branch')->where('dbid', $data["branch_dbid"])->value('name');
            return $name ?? "---";
        });
        // 部门数据编号
        $sqldb = $sqldb->withAttr("departments_dbid2", function ($value, $data) {
            // 返回某个字段的值
            $name = Db::table('admin__i_group_branch_departments')->where('dbid', $data["branch_dbid"])->value('name');
            return $name ?? "---";
        });
        $sqldb = $sqldb->withAttr("time_new2", function ($value, $data) {
            return date("Y-m-d H:i:s", $data["time_new"]);
        });
        $sqldb = $sqldb->withAttr("time_up2", function ($value, $data) {
            return date("Y-m-d H:i:s", $data["time_up"]);
        });



        $sqldb2 = $sqldb->toArray();
        //  当前页起始行
        if ($current > 1) {
            $index2 = $limit * $current - $limit + 1;
        } else {
            $index2 = 1;
        }
        // echo "当前总下标：" . $index2;
        for ($x = 0; $x < count($sqldb); $x++) {
            // $li_db[$x]['apitxtx'] = json_decode($li_db[$x]['apitxt'], true); //格式化插入
            // unset($li_db[$x]); //删除数组中的元素
            // ksort($li_db[$x]);//根据关联数组的键，对数组进行升序排列
            $sqldb2["data"][$x]['index1'] = $x + 1;
            $sqldb2["data"][$x]['index2'] = $index2;
            $index2++;
            // dump($sqldb2);
            // $sqldb[$x]['idb'] = $x++;
        }
        // 遍历数据集
        // foreach ($sql_db as $rs) {
        // foreach($age as $x=>$x_value)
        // $rs['event_linkman_card_id']="身份证号码呀---保密了";
        // unset($rs['sys_indexer']);//销毁
        // array_push($tem_data, $rs); //把每个数据集记录插入到数组
        // }
        // unset($tem_data); //销毁
        // array_push()	将一个或多个元素插入数组的末尾（入栈）。
        // array_merge()	把一个或多个数组合并为一个数组。
        // array_merge_recursive()	递归地把一个或多个数组合并为一个数组。
        // $count = count($list);
        $apidb = [
            'api' => ["code" => "001", "name" => "用户列表", "help" => $help], //API信息
            'code' => 200, //状态码
            'msg' => "查询成功！", //状态信息
            'query' => $query, //请求参数
            '_header' => request()->header('token'),
            '_cache' => cache('userdb_' . request()->header('token')),
            'data' => $sqldb2,
            'aaaaaaaa' => MYSQL::getLastSql(), //输出上次执行的sql语句/也可以使用fetchSql方法直接返回当前的查询SQL而不执行，例如：echo User::fetchSql()->find(1);
        ];
        unset($sqldb2); //销毁
        return (json($apidb));
    }
}
